package com.ln.leetcode._2352;

import org.junit.Test;

import java.sql.SQLOutput;
import java.util.Arrays;

/**
 * 相等行列对
 * <p>
 * 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ，返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。
 * <p>
 * 如果行和列以相同的顺序包含相同的元素（即相等的数组），则认为二者是相等的。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * <p>
 * 输入：grid = [[3,2,1],[1,7,6],[2,7,7]]
 * 输出：1
 * 解释：存在一对相等行列对：
 * - (第 2 行，第 1 列)：[2,7,7]
 * 示例 2：
 * <p>
 * <p>
 * <p>
 * 输入：grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
 * 输出：3
 * 解释：存在三对相等行列对：
 * - (第 0 行，第 0 列)：[3,1,2,2]
 * - (第 2 行, 第 2 列)：[2,4,2,2]
 * - (第 3 行, 第 2 列)：[2,4,2,2]
 * <p>
 * <p>
 * 提示：
 * <p>
 * n == grid.length == grid[i].length
 * 1 <= n <= 200
 * 1 <= grid[i][j] <= 105
 * <p>
 */
public class Solution {

    @Test
    public void test() {
//        System.out.println(equalPairs(new int[][]{
//                {3, 2, 1}, {1, 7, 6}, {2, 7, 7}
//        }));

        System.out.println(equalPairs(new int[][]{
                {3, 1, 2, 2}, {1, 4, 4, 5}, {2, 4, 2, 2}, {2, 4, 2, 2}
        }));

    }

    public int equalPairs(int[][] grid) {
        int sameCount = 0;
        // 行走
        StepWalk rowWalk = new StepWalk(grid, 0, 0);
        // 列走
        StepWalk colWalk = new StepWalk(grid, 0, 0);
        boolean firstColOver = false;
        boolean firstRowOver = false;
        // 外层是行走，内层是列走
        while (true) {
            // 如果列走走过一轮，则行走下走一步
            if (colWalk.currentCol == 0 && firstColOver) {
                rowWalk.walkDown();
                firstRowOver = true;
            }

            // 退出条件，行走到初始的地方
            if (rowWalk.currentRow == 0 && firstRowOver) {
                break;
            }

            // 如果行走与列走的值相同，则相互比较下一个元素
            int diffInitColInRow = rowWalk.currentCol;
            int diffInitRowInCol = colWalk.currentRow;
            while (rowWalk.getCurrentVal() == colWalk.getCurrentVal()) {
                rowWalk.walkRight();
                colWalk.walkDown();
                if (diffInitColInRow == rowWalk.currentCol && diffInitRowInCol == colWalk.currentRow) {
                    // 满足条件，计数累加1
                    ++sameCount;
                    // 打印出来
                    rowWalk.printCurrentRow();
                    colWalk.printCurrentCol();
                    break;
                }
            }

            // 没有相同的元素，列右走。继续下一轮的比较
            colWalk.walkRight();
            firstColOver = true;
        }

        return sameCount;
    }

    class StepWalk {
        private int[][] grid;
        private int currentRow;
        private int currentCol;

        public StepWalk(int[][] grid, int initRow, int initCol) {
            this.grid = grid;
            this.currentRow = initRow;
            this.currentCol = initCol;
        }

        public int getCurrentVal() {
            return grid[currentRow][currentCol];
        }

        public void walkRight() {
            currentCol = (currentCol + 1) % grid.length;
        }

        public void walkDown() {
            currentRow = (currentRow + 1) % grid.length;
        }

        public void printCurrentRow() {
            System.out.print("行：" + currentRow + ": ");
            Arrays.stream(grid[currentRow]).forEach(System.out::print);
            System.out.println();
        }

        public void printCurrentCol() {
            System.out.print("列：" + currentCol + ": ");
            Arrays.stream(grid).forEach(x -> System.out.print(x[currentCol]));
            System.out.println();
        }

    }

}
